package service

import (
	"chat/models"
	"chat/utils"
	"fmt"
	"github.com/asaskevich/govalidator"
	"github.com/gin-gonic/gin"
	"strconv"
)

// GetUserList
// @Tags 用户模块
// @Summary 获取用户列表
// @Success 200 {string} json{"code"."message"}
// @Router /user/getUserList [get]
func GetUserList(c *gin.Context) {
	_, err := utils.GetTokenValue(c.Request)
	if err != nil {
		c.JSON(500, gin.H{
			"message": "登录过期",
		})
		return
	}
	c.JSON(200, gin.H{
		"data":    models.UserListToVO(models.GetUserList()),
		"message": "",
	})
}

// CreateUser
// @Tags 用户模块
// @Summary 新增用户
// @param name query string false "用户名"
// @param password query string false "密码"
// @param rePassword query string false "重复密码"
// @param email query string false "邮箱"
// @param phone query string false "手机号"
// @Success 200 {string} json{"code"."message"}
// @Router /user/createUser [get]
func CreateUser(c *gin.Context) {
	session := utils.DB.Begin()
	defer session.Commit()
	if c.Query("password") != c.Query("rePassword") {
		utils.FailResult(c, "500", "密码不一致")
		session.Rollback()
		return
	}
	user := models.User{
		Name:     c.Query("name"),
		Password: c.Query("password"),
		Email:    c.Query("email"),
		Phone:    c.Query("phone"),
	}
	_, err := govalidator.ValidateStruct(user)
	if err != nil {
		utils.FailResult(c, "500", "请检查格式！")
		fmt.Println(err.Error())
		session.Rollback()
		return
	}
	if models.FindUserByName(user.Name).ID != 0 {
		utils.FailResult(c, "500", "用户已注册")
		return
	}
	if models.FindUserByPhone(user.Phone).ID != 0 {
		utils.FailResult(c, "500", "手机号已注册")
		session.Rollback()
		return
	}
	if models.FindUserByEmail(user.Email).ID != 0 {
		utils.FailResult(c, "500", "邮箱已注册")
		session.Rollback()
		return
	}
	user.Password = utils.Md5Encode(user.Password)
	utils.OkResult(c, models.CreateUser(user))
}

// DelUser
// @Tags 用户模块
// @Summary 删除用户
// @param id query string false "用户id"
// @Success 200 {string} json{"code"."message"}
// @Router /user/delUser [get]
func DelUser(c *gin.Context) {
	models.DelUser(c.Query("id"))
	utils.OkResult(c, nil)
}

// UpdateUser
// @Tags 用户模块
// @Summary 修改用户
// @param id formData string false "用户id"
// @param name formData string false "用户名"
// @param email formData string false "邮箱"
// @param phone formData string false "手机号"
// @Success 200 {string} json{"code"."message"}
// @Router /user/updateUser [POST]
func UpdateUser(c *gin.Context) {
	user := models.User{}
	id, _ := strconv.Atoi(c.PostForm("id"))
	user.ID = uint(id)
	user.Name = c.PostForm("name")
	user.Email = c.PostForm("email")
	user.Phone = c.PostForm("phone")
	_, err := govalidator.ValidateStruct(user)
	if err != nil {
		utils.FailResult(c, "500", "请检查格式！")
		return
	}
	user.Password = utils.Md5Encode(user.Password)
	models.UpdateUser(user)
	utils.OkResult(c, nil)
}

// LoginByNameAndPassword
// @Tags 用户模块
// @Summary 登录通过用户名和密码
// @Accept json
// @Produce json
// @Param data body models.User true "登录信息(JSON格式)"
// @Router /user/loginByNameAndPassword [POST]
func LoginByNameAndPassword(c *gin.Context) {
	var userDto models.User
	if err := c.ShouldBindJSON(&userDto); err != nil {
		utils.FailResult(c, "500", "请求参数错误！")
		return
	}
	user := models.FindUserByNameAndPassword(userDto.Name)
	if user.ID == 0 {
		utils.FailResult(c, "500", "用户不存在")
		return
	}
	if !utils.ValidPassword(userDto.Password, user.Password) {
		utils.FailResult(c, "500", "密码错误")
		return
	}
	tokenValue := utils.TokenValue{
		UserId: user.ID,
	}
	data := make(map[string]string)
	data["token"] = utils.CreateToken(tokenValue)
	data["userId"] = strconv.Itoa(int(user.ID))
	utils.OkResult(c, data)
}
